package org.cuijq.thinking.in.spring.dependency.injection;

import java.util.List;
import org.cuijq.thinking.in.spring.ioc.domain.SuperUser;
import org.cuijq.thinking.in.spring.ioc.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;

/**
 * @author by CuiJQ
 * @Classname XmlDepencySetterInjectionDemo
 * @Description XmlDepencySetterInjectionDemo Description
 * @Date 2021/6/29 9:04
 */
public class AnnotationDepencyFieldInjectionDemo {

  @Autowired
  private UserHolder userHolder;


  public static void main(String[] args) {
    //创建BeanFactory 容器
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    //注册
    applicationContext.register(AnnotationDepencyFieldInjectionDemo.class);

    XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);
    String xmlResourcePath = "classpath:/META-INF/dependency-lookuo-context.xml";
    beanDefinitionReader.loadBeanDefinitions(xmlResourcePath);

    applicationContext.refresh();

    AnnotationDepencyFieldInjectionDemo demo = applicationContext.getBean(AnnotationDepencyFieldInjectionDemo.class);

    UserHolder userHolder = demo.userHolder;
    System.out.println(userHolder);

    applicationContext.close();
  }

  @Bean
  @Qualifier("user")
  User user() {
    User user = new User();
    user.setId(1L);
    user.setName("xxx");
    return user;
  }

  ;

  @Bean
  @UserGroup()
  User user1() {
    User user = new User();
    user.setId(2L);
    user.setName("xxxxGroup");
    return user;
  }

  ;


  @Bean
  @Qualifier("superUser")
  SuperUser user2() {
    SuperUser user = new SuperUser();
    user.setId(2L);
    user.setName("superUserXxxxGroup");
    return user;
  }

  @Bean
  public UserHolder userHolder(User user) {
    return new UserHolder(user2());
  }
}
